// 绑定到对象上的函数称为方法


// 是否写；看有没有=  ，比如现在我看到单独定义一个函数就不用

// 字段是函数，不就相当于java中get,set吗

'use strict'
var xiaoming = {
    name: "bingley",
    birth: 1991,
    age: function () {
        var y = new Date().getFullYear();
        return y - this.birth;
    }
};

console.log(xiaoming.age);
console.log(xiaoming.age());


// this 的坑点
var xiaoming = {
    name: '小明',
    birth: 1990,
    age: function () {
        var y = new Date().getFullYear();
        return y - this.birth;
    }
};

var fn = xiaoming.age;
//console.log(fn()); // Unca


// 解决方式
var xiaoming = {
    name: '小明',
    birth: 1990,
    age: function () {
        var that = this; // 在方法内部一开始就捕获this
        function getAgeFromBirth() {
            var y = new Date().getFullYear();
            return y - that.birth; // 用that而不是this
        }
        return getAgeFromBirth();
    }
};

console.log(xiaoming.age())


// *****************apply
function getAge() {
    var y = new Date().getFullYear();
    return y - this.birth;
}

var xiaoming = {
    name: '小明',
    birth: 1990,
    age: getAge
};

xiaoming.age(); // 
getAge.apply(xiaoming, []); //  this指向xiaoming, 参数为空


var applyvalue = Math.max.apply(null, [3, 5, 4]); // 5
var callvalue = Math.max.call(null, 3, 5, 4); // 5
console.log("applyvalue==" + applyvalue);
console.log("callvalue===" + callvalue);

// **********装饰器

var count = 0;
var oldParseInt = parseInt; // 保存原函数

window.parseInt = function () {
    count += 1;
    return oldParseInt.apply(null, arguments); // 调用原函数
};

parseInt('10');
parseInt('20');
parseInt('30');
console.log('count = ' + count); // 3